package com.ibeetl.admin.api.util;

public class DistanceCalculatorUtils {
    //Vincenty和Haversine两种方法都可以计算经纬度之间的距离，但适用于不同的场景。如果对计算结果的精度要求较低，可以使用Haversine公式；如果对计算结果的精度要求较高，可以使用Vincenty公式。


    private static final double EARTH_RADIUS_Vincenty = 6371.0; // 地球半径，单位为千米
    //Vincenty公式是一种更准确的计算方法，可以考虑地球的椭球形状。
    public static double calculateDistanceVincenty(double lat1, double lon1, double lat2, double lon2) {
        double phi1 = Math.toRadians(lat1);
        double lambda1 = Math.toRadians(lon1);
        double phi2 = Math.toRadians(lat2);
        double lambda2 = Math.toRadians(lon2);

        double deltaLambda = Math.abs(lambda1 - lambda2);
        double numerator = Math.sqrt(
                Math.pow(Math.cos(phi2) * Math.sin(deltaLambda), 2) +
                        Math.pow(Math.cos(phi1) * Math.sin(phi2) - Math.sin(phi1) * Math.cos(phi2) * Math.cos(deltaLambda), 2)
        );
        double denominator = Math.sin(phi1) * Math.sin(phi2) + Math.cos(phi1) * Math.cos(phi2) * Math.cos(deltaLambda);

        double distance = EARTH_RADIUS_Vincenty * Math.atan2(numerator, denominator);

        return distance;
    }






    private static final int EARTH_RADIUS = 6371; // 地球半径，单位为千米

    //Haversine公式是一种常用的方法，用于计算球面上两个点之间的距离。在此方法中，假设地球是一个完美的球体，忽略了地球的椭球形状。
    public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
        double dLat = Math.toRadians(lat2 - lat1);
        double dLon = Math.toRadians(lon2 - lon1);

        double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
                + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
                * Math.sin(dLon / 2) * Math.sin(dLon / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        double distance = EARTH_RADIUS * c;

        return distance;
    }


}
